/*
 * Bsp_task.c
 *
 *  Created on: May 27, 2025
 *      Author: Administrator
 */
#include "Bsp.h"
#include "cmsis_os.h"


//int enable_beep = 0;

// LED light task entity function  LED灯任务实体函数
void Task_Entity_LED(void)
{
    while (1)
    {
        // The indicator lights up every 100 milliseconds  指示灯每隔100毫秒亮一次
        LED_TOGGLE();
        vTaskDelay(500);
//        osDelay(100);
    }
}

// Buzzer task entity function  蜂鸣器任务实体函数
//void Task_Entity_Beep(void)
//{
//    while (1)
//    {
//        if (enable_beep)
//        {
//            BEEP_OFF();
//            osDelay(100);
//        }
//        else
//        {
//            BEEP_OFF();
//            osDelay(200);
//        }
//    }
//}
void Task_Entity_Beep(void) {
    while (1) {
        Beep_Timeout_Close_Handle();  // 处理超时关闭
        vTaskDelay(10);  // 10ms周期
    }
}


// Key task entity function  按键任务实体函数
void Task_Entity_Key(void)
{
	uint8_t state = 0;
    while (1)
    {
        if (Key1_State() == Key_Press)
        {
            Beep_On_Time(50);
            if (state == 0) {
                Motion_Ctrl(350, 0, 0);
                state = 1;
            } else {
                Motion_Stop(STOP_BRAKE);
                state = 0;
            }
            // Button controls the buzzer switch  按键控制蜂鸣器开关
        }
        osDelay(10);
    }
}

void Task_Entity_Motion(void){

    TickType_t lastWakeTime = xTaskGetTickCount();

    while (1)
    {

        Motion_Handle();
        vTaskDelayUntil(&lastWakeTime, pdMS_TO_TICKS(10));  // 精确延时 10ms
    }

    Motion_Stop(STOP_FREE);
    while (1) {
        vTaskDelay(pdMS_TO_TICKS(1000));
    }
}

void Task_Entity_UartControl(void){

  	uint32_t lastWakeTime = xTaskGetTickCount();

    while (1)
    {
        Process_UART_Data();  // 每 10ms 处理一次
        vTaskDelayUntil(&lastWakeTime, 10);
    }
}

void Task_Entity_SensorSend(void){

    uint32_t lastWakeTime = xTaskGetTickCount();
    uint16_t report_count = 0;

    while (1)
    {
        if (report_count == 1)
        {
            send_speed_data(car_data.Vx, car_data.Vy, car_data.Vz);  // 每 40ms 发送一次速度数据
        }
        else if (report_count == 11)
        {
            MPU9250_Send_Data();  // 每 40ms 发送一次 IMU 数据
        }

        report_count++;
        if (report_count >= 40) report_count = 0;//周期为40ms

        vTaskDelayUntil(&lastWakeTime, 1);  // 每 1ms 执行一次
    }
}

void Task_Entity_Display(void){

    uint16_t display_refresh_count  = 0;

    while (1)
    {
        //处理LED状态显示
        Bsp_Led_Show_State_Handle();

        // 数据显示节奏（100ms）
        if (++display_refresh_count >= 10)
        {
        	display_refresh_count = 0;
            OLED_ShowNum(1, 4, car_data.Vx, 4);  // 显示 Vx
            OLED_ShowNum(2, 4, car_data.Vy, 4);  // 显示 Vy
            OLED_ShowNum(3, 4, car_data.Vz, 4);  // 显示 Wz（角速度）
        }

        vTaskDelay(50); // 改为50ms一个周期
    }
}

void Task_Entity_ReadIMU(void){
    uint32_t lastWakeTime = xTaskGetTickCount();

    while (1)
    {
        // 仅使用 MPU9250
        MPU9250_Read_Data_Handle();

        // 每 10ms 读取一次 IMU 数据
        vTaskDelayUntil(&lastWakeTime, 10);
    }
}
